package mine.code.question.动态规划;

import org.junit.Test;

/**
 * 一个有名的按摩师会收到源源不断的预约请求，每个预约都可以选择接或不接。在每次预约服务之间要有休息时间，
 * 因此她不能接受相邻的预约。给定一个预约请求序列，替按摩师找到最优的预约集合（总预约时间最长），返回总的分钟数。
 * <p>
 * 示例 1：
 * <p>
 * 输入： [1,2,3,1]
 * 输出： 4
 * 解释： 选择 1 号预约和 3 号预约，总时长 = 1 + 3 = 4
 *
 * @author caijinnan
 * @date 2020/3/17 17:22
 */
public class 按摩师 {
    @Test
    public void run() {
        int[] nums = {2, 1, 4, 5, 3, 1, 1, 3};
        System.out.println(massage(nums));
    }

    // 遍历数组,当前位置最大取值,由上一位最大值与上两位最大值加当前值决定,可得公式
    // dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i])
    // 同时最低两位取值为nums[0],和nums[0],nums[1]的最大值
    public int massage(int[] nums) {
        //排除长度为0的情况
        if (nums.length == 0) {
            return 0;
        }
        //数组长度为一时,只有一个值可以返回
        if (nums.length == 1) {
            return nums[0];
        }
        int[] stepNumArr = new int[nums.length];
        for (int i = 0, length = nums.length; i < length; i++) {
            if (i < 2) {
                stepNumArr[0] = nums[0];
                stepNumArr[1] = Math.max(nums[0], nums[1]);
            } else {
                stepNumArr[i] = Math.max(stepNumArr[i - 1], stepNumArr[i - 2] + nums[i]);
            }
        }
        return stepNumArr[stepNumArr.length - 1];
    }

}